home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / dmake / save / convert.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-11-23  |  2.2 KB  |  113 lines

  1.  
  2. /*
  3.  *  CONVERT.C
  4.  */
  5.  
  6. #include "defs.h"
  7.  
  8. #define MAXLEVELS   10
  9.  
  10. Prototype int  WildConvert(char *, char *, char *, char *);
  11.  
  12. /*
  13.  *  Run srcBuf through the srcMat pattern matcher and if it matches
  14.  *  convert it via dstMat into dstBuf, else dstBuf \0 len.
  15.  */
  16.  
  17.  
  18. int
  19. WildConvert(srcBuf, dstBuf, srcMat, dstMat)
  20. char *srcBuf;
  21. char *dstBuf;
  22. char *srcMat;
  23. char *dstMat;
  24. {
  25.     short r = 0;
  26.     long i;
  27.     static short Index;
  28.     static short SubLen[MAXLEVELS];
  29.     static char *SubStr[MAXLEVELS];
  30.  
  31.     if (Index == MAXLEVELS)
  32.     error(FATAL, "maximum recursion reached in WildConvert");
  33.  
  34.     db4printf(("WildConvert %-15s (%s -> %s)\n", srcBuf, srcMat, (dstMat) ? dstMat : "..."));
  35.  
  36.     /*
  37.      *    skip non-wildcards, srcBuf must match srcMat
  38.      */
  39.  
  40.     while (*srcMat && *srcMat != '*' && *srcMat != '?') {
  41.     if (*srcBuf != *srcMat)
  42.         return(-1);
  43.     ++srcBuf;
  44.     ++srcMat;
  45.     }
  46.  
  47.     switch(*srcMat) {
  48.     case '\0':                      /*  match end, terminating case */
  49.     if (*srcBuf)                /*  buf srcBuf not exhausted!   */
  50.         r = -1;
  51.     break;
  52.     case '?':                       /*  match 1 */
  53.     if (*srcBuf == 0)           /*  match failed against srcbuf  */
  54.         return(-1);
  55.     SubStr[Index] = srcBuf;
  56.     SubLen[Index] = 1;
  57.     ++Index;
  58.     r = WildConvert(srcBuf + 1, NULL, srcMat + 1, NULL);
  59.     --Index;
  60.     break;
  61.     case '*':                       /*  match any   */
  62.     /*
  63.      *  strangeness in loop is so \0 (nil string) is checked for,
  64.      *  it is perfectly valid for the remainder to be nil.
  65.      *
  66.      *  note: bug in NeXT's GCC -O/-O2, had to reorder r == -1 to
  67.      *  the right side of the &&
  68.      */
  69.  
  70.     r = -1;
  71.     for (i = 0; (i == 0 || srcBuf[i-1]) && r == -1; ++i) {
  72.         SubStr[Index] = srcBuf;
  73.         SubLen[Index] = i;
  74.         ++Index;
  75.         r = WildConvert(srcBuf + i, NULL, srcMat + 1, NULL);
  76.         --Index;
  77.     }
  78.     break;
  79.     }
  80.     if (r == 0 && dstMat) {
  81.     short k = 0;
  82.     short n;
  83.  
  84.     while (*dstMat) {
  85.         switch(*dstMat) {
  86.         case '%':
  87.         n = (dstMat[1] - '1');
  88.         case '*':
  89.         case '?':
  90.         if (*dstMat == '%')
  91.             ++dstMat;
  92.         else
  93.             n = k++;
  94.  
  95.         if (n >= 0 && n < MAXLEVELS) {
  96.             movmem(SubStr[n], dstBuf, SubLen[n]);
  97.             dstBuf += SubLen[n];
  98.         }
  99.         break;
  100.         default:
  101.         *dstBuf++ = *dstMat;
  102.         break;
  103.         }
  104.         ++dstMat;
  105.     }
  106.     *dstBuf = 0;
  107.     }
  108.     db4printf((" r = %d\n", r));
  109.     return(r);
  110. }
  111.  
  112.  
  113.